package org.rency.common.utils.security;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 用于Windows生成Java KeyStore证书
 * @author: user_rcy@163.com
 * </br>Created on 2016年3月9日
 * @version: V1.0.0
 * @since JDK 1.8
 */
public class KeyStoreUtils {
	
	private static final Logger logger = LoggerFactory.getLogger(KeyStoreUtils.class);

	private static void execCommand(String[] arstringCommand) {  
        for (int i = 0; i < arstringCommand.length; i++) {  
        	logger.debug("exec command : {}",arstringCommand[i]);  
        }  
        try {  
            Runtime.getRuntime().exec(arstringCommand);  
        } catch (Exception e) {  
        	logger.error("exec command error.",e.getMessage());
        }  
    }
    
    /**
     * 生成证书
     * </br>Created on 2016年3月9日
     * @param alias 证书别名,默认为 test
     * @param path 证书存储路径,默认为用户主目录下test.keystore
     * @param passwd 证书密码,默认 test
     * @param validityDay 证书有效期(天),默认 36500
     * @param user 证书名字(指定为服务器域名),默认 test
     */
    public static void genkey(String alias,String path,String passwd,String validityDay,String user) {  
    	if(StringUtils.isBlank(alias)){
    		alias = "test";
    	}
    	if(StringUtils.isBlank(path)){
    		path = System.getProperty("user.home")+"/test.keystore";
    	}
    	if(StringUtils.isBlank(passwd)){
    		passwd = "test";
    	}
    	if(StringUtils.isBlank(validityDay)){
    		validityDay = "36500";
    	}
    	if(StringUtils.isBlank(user)){
    		user = "test";
    	}
        String[] arstringCommand = new String[] {  
  
        "cmd ", "/k",  
                "start", // cmd Shell命令  
                "keytool",  
                "-genkey", // -genkey表示生成密钥  
                "-validity", // -validity指定证书有效期(单位：天)，这里是36000天  
                validityDay,  
                "-keysize",//     指定密钥长度  
                "1024",  
                "-alias", // -alias指定别名，这里是ss  
                alias,  
                "-keyalg", // -keyalg 指定密钥的算法 (如 RSA DSA（如果不指定默认采用DSA）)  
                "RSA",  
                "-keystore", // -keystore指定存储位置，这里是d:/demo.keystore  
                path,  
                "-dname",// CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称),  
                            // ST=(州或省份名称), C=(单位的两字母国家代码)"  
                "CN=("+user+"), OU=(SS), O=(SS), L=(BJ), ST=(BJ), C=(CN)",  
                "-storepass", // 指定密钥库的密码(获取keystore信息所需的密码)  
                passwd,   
                "-keypass",// 指定别名条目的密码(私钥的密码)  
                passwd,   
                "-v"// -v 显示密钥库中的证书详细信息  
        };  
        execCommand(arstringCommand);
        logger.info("生成KeyStore证书完成,别名:{}, 存储路径:{}, 有效期:{}, 证书名字:{}.",alias,path,validityDay,user);
    }
    
    /**
     * 导出证书文件  
     * </br>Created on 2016年3月9日
     * @param alias 证书别名
     * @param keyStorePath KeyStore证书存储路径
     * @param certPath 导出Cert存储路径
     * @param passwd 证书密码
     */
    public static void exportCert(String alias,String keyStorePath,String certPath,String passwd) {
    	if(StringUtils.isBlank(alias) || StringUtils.isBlank(keyStorePath) || StringUtils.isBlank(certPath) || StringUtils.isBlank(passwd)){
    		return;
    	}
        String[] arstringCommand = new String[] {  
  
        "cmd ", "/k",  
                "start", // cmd Shell命令  
  
                "keytool",  
                "-export", // - export指定为导出操作   
                "-keystore", // -keystore指定keystore文件，这里是d:/demo.keystore  
                keyStorePath,  
                "-alias", // -alias指定别名，这里是ss  
                alias,  
                "-file",//-file指向导出路径  
                certPath,  
                "-storepass",// 指定密钥库的密码  
                passwd  
        };  
        execCommand(arstringCommand);  
        logger.info("导出证书完成,别名:{}, 导出路径:{}, 有效期:{}, 证书名字:{}.",alias,certPath);
    } 
	
}